package com.rr.singleton;


//懒汉式
public class LazyMan {
//
//
//    private LazyMan(){
//        System.out.println(Thread.currentThread().getName()+"ok");
//    }
//
//    //volatile: 防止被指令重排
//    private volatile static LazyMan lazyMan;
//
//    //双重检测锁模式 懒汉式单例  DCL懒汉式
//    public static LazyMan getInstance(){
//        //加锁
//        if(lazyMan==null){
//            synchronized (LazyMan.class){
//                if(lazyMan==null){
//                    lazyMan=new LazyMan();//不是原子性操作
//原子性操作:一个或某几个操作只能在一个线程执行完之后，另一个线程才能开始执行该操作，
// 也就是说这些操作是不可分割的，线程不能在这些操作上交替执行。
//                    /**
//                     * 1.分配内存空间
//                     * 2.执行构造方法,初始化对象
//                     * 3.把这个对象指向这个空间
//                     */
//                }
//            }
//        }
//        return lazyMan;
//    }
//    //多线程并发
//    public static void main(String[] args) {
//        for (int i=0;i<10;i++){
//            new Thread(()->{
//                lazyMan.getInstance();
//            }).start();
//        }
//    }

    //对所有属性设置访问权限  当类中的成员变量为private时 必须设置此项
    /**
     * 一般情况下，我们并不能对类的私有字段进行操作，利用反射也不例外，
     * 但有的时候，例如要序列化的时候，我们又必须有能力去处理这些字段，
     * 这时候，我们就需要调用AccessibleObject上的setAccessible()方法来允许这种访问，
     *因此，通过在这些类上调用setAccessible()方法，我们可以实现对这些字段的操作。
     */

//    //反射
//    public static void main(String[] args) throws Exception {
//        //LazyMan instance1 = LazyMan.getInstance();
//
//        Field qinjiang = LazyMan.class.getDeclaredField("qinjiang");
//        qinjiang.setAccessible(true);
//
//        Constructor<LazyMan> declaredConstructor = LazyMan.class.getDeclaredConstructor(null);
//        declaredConstructor.setAccessible(true);
//        //两个对象用同样的方式创建,反射又会被破坏
//        LazyMan instance1 = declaredConstructor.newInstance();
//
//        qinjiang.set(instance1, false);
//
//        LazyMan instance2 = declaredConstructor.newInstance();
//        System.out.println(instance1);
//        System.out.println(instance2);
//    }
//}

//public class LazyMan{
//
//        //私有的静态属性
//        private volatile static LazyMan lazyMan;
//
//        //私有的构造方法
//        private LazyMan(){
//            System.out.println(Thread.currentThread().getName()+"ok");
//        }
//
//        //公共的静态入口
//        public static LazyMan getLazyMan(){
//            if(lazyMan==null){
//                synchronized (LazyMan.class){
//                    if (lazyMan==null){
//                        lazyMan=new LazyMan();
//                    }
//                }
//            }
//            return lazyMan;
//        }
//
//        //多线程并发
//        public static void main(String[] args) {
//            for (int i = 0; i < 10; i++) {
//                new Thread(()->{
//                    LazyMan.getLazyMan();
//                }).start();
//            }
//        }
   }